#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020/11/8 6:00
# @Author : youngchaolin

# 1 装饰器的使用：登录认证
# 只有登录成功后，才能访问博客园的页面里的内容，否则提示重新登录

#  定义一个字典，记录登录状态
status_dict={
    'username':None,
    'status':False
}

# 三次登录验证函数，直接拿来用
# 登录成功，返回True，三次登录都验证失败，则返回False
def login_check():
    count=1
    while count<4:
        u=input("请输入用户名")
        p=input("请输入密码")
        # 读取文件，获取用户名和密码，保存到一个字典中
        with open('login.txt',mode='r',encoding='utf-8') as f:
            for line in f:
                # 读取文件后，密码会加一个\n换行符，需要使用strip去掉
                if u == line.split('|')[0].strip() and p == line.split('|')[1].strip():
                    print("登录成功")
                    status_dict['username']=u
                    status_dict['status']=True
                    return True
        # 能执行到这里，说明登录失败
        print('登录失败')
        # 提示剩余次数
        print("你还有%d次机会"%(3-count))
        # 次数
        count+=1
    else:
        print("没机会了老哥")
        return False



# 定义装饰器
def auth(f):
    def inner(*args,**kwargs):
        # 访问函数之前的操作
        # 访问被装饰函数之前，写一个三次登录认证的功能
        # 登录成功，让其访问被装饰函数，登录没有成功，不让访问
        if status_dict.get('status'):
            ret=f(*args,**kwargs)
            # 访问函数之后的操作
            return ret
        else :
            # 登录
            login_check()
            if status_dict.get('status'):
                ret=f(*args,**kwargs)
                return ret
            else:
                print('登录失败，请重新登录')
    return inner

def login():
    login_check()

def register():
    username=''
    password=''
    while True:
        # 验证用户名
        username=input('请输入用户名[字母和数字组成]')
        if not username.isalnum():
            print('请输入正确格式的用户名')
        else:
            # 验证是否唯一，如果不唯一还需要迭代
            with open('login.txt',mode='rt',encoding='utf-8') as f:
                for line in f:
                    if username == line.split('|')[0].strip():
                        print('用户名已存在，请重试')
                        break
                else:
                    # 正常就结束外层循环
                    break

    while True:
        # 验证密码
        password=input('请输入6-14字符密码')
        if len(password)<6 or len(password)>14:
            print('请输入正确格式的密码')
        else:
            break
    # 写入文件'login.txt'
    with open('login.txt', mode='a', encoding='utf-8') as f:
        f.write(username+'|'+password+'\n')
        print(f'恭喜你{username},注册成功')



@auth
def article():
    print(f'欢迎{status_dict["username"]}进入文章页面')
    # 写入内容到文章
    while True:
        num=input('直接写入内容请输入1 导入md文件请输入2')
        if num.isdecimal() and (int(num)==1 or int(num)==2):
            # 获取字典里的方法，进行操作，不建议使用if-else这种写法
            article_operation_dic.get(int(num))()
            break
        else:
            print('输入操作方式有误')

# 写入文章方式1
def method1():
    article_name=input('请输入文章名字')
    article_naiyo=input('请输入文章内容')
    with open(article_name,mode='w',encoding='utf-8') as f:
        f.write(article_naiyo)
    print('发表文章成功')

# 写入文章方式2
def method2():
    path=input('请输入要导入的文件名[相对路径]')
    article_name=input('请输入文章名')
    with open(path,mode='r',encoding='utf-8') as f1,open(article_name,mode='a',encoding='utf-8') as f2:
        for line in f1:
            f2.write(line)
    print('发表文章成功')



article_operation_dic={
    1:method1,
    2:method2
}

@auth
def comment():
    print(f'欢迎{status_dict["username"]}进入评论页面')
@auth
def dairy():
    print(f'欢迎{status_dict["username"]}进入日记页面')
@auth
def collections():
    print(f'欢迎{status_dict["username"]}进入收藏页面')

def logout():
    # 清空登录状态字典
    status_dict['username']=None
    status_dict['status']=False
    print('注销成功')

def my_quit():
    quit()

# 可以直接调用，在调用之前，需要进行登录和注册验证的装饰
# article()
# # 只要前面一个成功了，后面的都可以访问
# comment()
# dairy()

dic={
    1:login,
    2:register,
    3:article,
    4:comment,
    5:dairy,
    6:collections,
    7:logout,
    8:my_quit
}

# 循环选择
while True:
    print('''
    1.请登录
    2.请注册
    3.进入文章页面
    4.进入评论页面
    5.进入日记页面
    6.进入收藏页面
    7.注销账号
    8.退出整个程序
    ''')
    num=input('请选择操作方式')
    if num.isdecimal() and int(num)>0 and int(num)<9:
        # 获取字典里的方法，进行操作，不建议使用if-else这种写法
        dic.get(int(num))()
    else:
        print('输入操作方式有误')
